package com.jzo2o.es.utils;

import com.jzo2o.common.utils.BeanUtils;
import com.jzo2o.common.utils.CollUtils;
import org.elasticsearch.xcontent.XContentBuilder;
import org.elasticsearch.xcontent.XContentFactory;

import java.io.IOException;
import java.util.Map;

/**
 * Elasticsearch文档工具类，提供JavaBean与ES文档格式的转换能力
 */
public class DocumentUtils {

    /**
     * 将JavaBean转换为Elasticsearch的XContentBuilder（JSON格式文档）
     * <b>注意：不支持集合类型的JavaBean转换</b>
     *
     * @param document 待转换的JavaBean对象
     * @param <T>      JavaBean类型
     * @return Elasticsearch文档构建器XContentBuilder；转换失败（空对象/IO异常）则返回null
     */
    public static <T> XContentBuilder convert(T document)  {
        // 将JavaBean转为Map
        Map<String, Object> map = BeanUtils.beanToMap(document);

        // 若Map为空（Bean无属性或转换失败），返回null
        if (CollUtils.isEmpty(map)) {
            return null;
        }

        try {
            // 构建ES JSON文档
            XContentBuilder xContentBuilder = XContentFactory.jsonBuilder();
            // 遍历Map，设置文档字段
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                xContentBuilder.field(entry.getKey(), entry.getValue());
            }
            // 结束JSON对象构建
            return xContentBuilder.endObject();
        } catch (IOException e) {
            // 发生IO异常时返回null
            return null;
        }
    }
}
